using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using Sinacor.Infra.Service.Common;
using Sinacor.Servico.Bovespa.Corretagem.BusinessEntity;


namespace Sinacor.Servico.Bovespa.Corretagem.ResourceAccess
{
    /// <summary>
    /// Faixa Corretagem
    /// </summary>
	public class FaixaCorretagem : BaseResourceAccess
	{
		#region Construtor
		
		/// <summary>
		/// Construtor Padrão
		/// </summary>
		public FaixaCorretagem() : base(AuthorizationContext.Current.CompanyId)
		{
		}
		
		
		#endregion
		#region Métodos
        #region AlterarFaixaCorretagem
        /// <summary>
		/// Método AlterarFaixaCorretagem
		/// </summary>
        public void AlterarFaixaCorretagem(Sinacor.Servico.Bovespa.Corretagem.BusinessEntity.FaixaCorretagem request)
		{

            using (DbCommand command = this.DataBase.GetSqlStringCommand(" "))
            {
                #region SQL
                System.Text.StringBuilder sql = new System.Text.StringBuilder();

                sql.Append(@" UPDATE	TBOFAIXA		
                SET	DT_PREFIM	=	:DataFinal
                ,	VL_VALINF	=	:ValorInferior
                ,	VL_VALSUP	=	:ValorSuperior
                ,	PC_ALIQUO	=	:PercentualAliquota
                ,	VL_ACRESC	=	:ValorAcrescimo
                WHERE	NR_FAIXA	=	:NumeroFaixa
                AND	DT_PREINI	=	:DataInicial");                                 
                
                #endregion

                #region Filtro
                this.DataBase.AddInParameter(command, "DataFinal", DbType.DateTime, request.DataFinal.Value);
                this.DataBase.AddInParameter(command, "ValorInferior", DbType.Decimal, request.ValorInferior.Value);
                this.DataBase.AddInParameter(command, "ValorSuperior", DbType.Decimal, request.ValorSuperior.Value);
                this.DataBase.AddInParameter(command, "PercentualAliquota", DbType.Decimal, request.PercentualAliquota.Value);
                this.DataBase.AddInParameter(command, "ValorAcrescimo", DbType.Decimal, request.ValorAcrescimo.Value);
                this.DataBase.AddInParameter(command, "NumeroFaixa", DbType.Int32, request.NumeroFaixa.Value);
                this.DataBase.AddInParameter(command, "DataInicial", DbType.DateTime, request.DataInicial.Value);

                #endregion

               command.CommandText = sql.ToString();
               this.DataBase.ExecuteNonQuery(command);
            }

        }
        #endregion
        #region ConsultarFaixasCorretagens
        /// <summary>
		/// Método ConsultarFaixasCorretagens
		/// </summary>
		public List<BusinessEntity.FaixaCorretagem> ConsultarFaixasCorretagens(BusinessEntity.Parameter.FiltroFaixaCorretagem request)
		{

            List<BusinessEntity.FaixaCorretagem> responses = null;
            StringBuilder sql = new StringBuilder();
            using (DbCommand command = this.DataBase.GetSqlStringCommand(" "))
            {
                #region SQL
                sql.Append(@"SELECT	A.NR_FAIXA	NumeroFaixa	
                ,	A.DT_PREINI	DataInicial	
                ,	A.DT_PREFIM	DataFinal	
                ,	A.VL_VALINF	ValorInferior
                ,	A.VL_VALSUP	ValorSuperior
                ,	A.PC_ALIQUO	PercentualAliquota
                ,	A.VL_ACRESC	ValorAcrescimo
                FROM	TBOFAIXA A
                WHERE    1 = 1");

                if (request.Periodo != null)
                {
                    if (request.Periodo.DataInicial != null)
                  {     
                      sql.Append("  AND A.DT_PREINI >= :DataInicial ");
                      this.DataBase.AddInParameter(command, "DataInicial", DbType.DateTime, request.Periodo.DataInicial.Value);
                        
                  }

                    if (request.Periodo.DataFinal != null)
                  {
                     sql.Append("  AND A.DT_PREFIM <= :DataFinal ");
                     this.DataBase.AddInParameter(command, "DataFinal", DbType.DateTime, request.Periodo.DataFinal.Value);
                  }

                }


                if (request.NumeroFaixa != null)
                {
                    sql.Append("  AND A.NR_FAIXA = :NumeroFaixa ");
                    this.DataBase.AddInParameter(command, "NumeroFaixa", DbType.Int32, request.NumeroFaixa.Value);
                }
                if (request.DataInicial != null)
                {
                    sql.Append("  AND A.DT_PREINI = :DataInicial ");
                    this.DataBase.AddInParameter(command, "DataInicial", DbType.DateTime, request.DataInicial.Value);
                }
                if (request.DataFinal != null)
                {
                    sql.Append("  AND A.DT_PREFIM = :DataFinal ");
                    this.DataBase.AddInParameter(command, "DataFinal", DbType.DateTime, request.DataFinal.Value);
                }
                if (request.ValorInferior != null)
                {
                    sql.Append("  AND A.VL_VALINF = :ValorInferior ");
                    this.DataBase.AddInParameter(command, "ValorInferior", DbType.Decimal, request.ValorInferior.Value);
                }
                if (request.ValorSuperior != null)
                {
                    sql.Append("  AND A.VL_VALSUP= :ValorSuperior ");
                    this.DataBase.AddInParameter(command, "ValorSuperior", DbType.Decimal, request.ValorSuperior.Value);
                }
                if (request.PercentualAliquota != null)
                {
                    sql.Append("  AND A.PC_ALIQUO= :PercentualAliquota ");
                    this.DataBase.AddInParameter(command, "PercentualAliquota", DbType.Decimal, request.PercentualAliquota.Value);
                }
                if (request.ValorAcrescimo != null)
                {
                    sql.Append("  AND A.VL_ACRESC = :ValorAcrescimo ");
                    this.DataBase.AddInParameter(command, "ValorAcrescimo", DbType.Decimal, request.ValorAcrescimo.Value);
                }

                sql.Append(" ORDER BY DT_PREINI, NR_FAIXA ");


                        


                #endregion


                command.CommandText = sql.ToString();

                responses = this.FindAll<BusinessEntity.FaixaCorretagem>(command, new ConstructEntity<BusinessEntity.FaixaCorretagem>(ConstrutorConsultarFaixasCorretagens));

                return responses;

            }




        }
        #endregion
        #region ConstrutorConsultarFaixasCorretagens
        /// <summary>
        /// Consultar Faica Corretagem
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        protected BusinessEntity.FaixaCorretagem ConstrutorConsultarFaixasCorretagens(IDataReader reader)
        {
            BusinessEntity.FaixaCorretagem entity = new BusinessEntity.FaixaCorretagem();


            entity.NumeroFaixa = reader.GetValue<System.Int32?>("NumeroFaixa");
            entity.DataInicial = reader.GetValue<System.DateTime?>("DataInicial");
            entity.DataFinal = reader.GetValue<System.DateTime?>("DataFinal");
            entity.ValorInferior = reader.GetValue<System.Decimal?>("ValorInferior");
            entity.ValorSuperior = reader.GetValue<System.Decimal?>("ValorSuperior");
            entity.PercentualAliquota = reader.GetValue<System.Decimal?>("PercentualAliquota");
            entity.ValorAcrescimo = reader.GetValue<System.Decimal?>("ValorAcrescimo");
            
            return entity;
        }
        #endregion
        #region ExcluirFaixaCorretagem
        /// <summary>
		/// Método ExcluirFaixaCorretagem
		/// </summary>
		public void ExcluirFaixaCorretagem(BusinessEntity.Parameter.FiltroFaixaCorretagemChave parameter)
		{

            using (DbCommand command = this.DataBase.GetSqlStringCommand(" "))
            {
                #region SQL
                StringBuilder sql = new StringBuilder();

                sql.Append(@" DELETE FROM	TBOFAIXA		
                WHERE	NR_FAIXA	=	:NumeroFaixa
                AND	DT_PREINI	=	:DataInicial
                ");

                #endregion

                #region Filtro
                this.DataBase.AddInParameter(command, "NumeroFaixa", DbType.Int32, parameter.NumeroFaixa.Value);
                this.DataBase.AddInParameter(command, "DataInicial", DbType.DateTime, parameter.DataInicial.Value);

                #endregion

                command.CommandText = sql.ToString();
                this.DataBase.ExecuteNonQuery(command);
            }

			
        }

        #endregion
        #region IncluirFaixaCorretagem
        /// <summary>
		/// Método IncluirFaixaCorretagem
		/// </summary>
		public void IncluirFaixaCorretagem(BusinessEntity.FaixaCorretagem request)
		{

            using (DbCommand command = this.DataBase.GetSqlStringCommand(" "))
            {
                #region SQL
                StringBuilder sql = new StringBuilder();

                sql.Append(@" INSERT INTO TBOFAIXA
                (	NR_FAIXA
                ,	DT_PREINI
                ,	DT_PREFIM
                ,	VL_VALINF
                ,	VL_VALSUP
                ,	PC_ALIQUO
                ,	VL_ACRESC
                )	
                VALUES	
                (	:NumeroFaixa
                ,	:DataInicial
                ,	:DataFinal
                ,	:ValorInferior
                ,	:ValorSuperior
                ,	:PercentualAliquota
                ,	:ValorAcrescimo
                )	");                                 
                                
                #endregion

                #region Filtro
                this.DataBase.AddInParameter(command, "NumeroFaixa", DbType.Int32, request.NumeroFaixa.Value);
                this.DataBase.AddInParameter(command, "DataInicial", DbType.DateTime, request.DataInicial.Value);
                this.DataBase.AddInParameter(command, "DataFinal", DbType.DateTime, request.DataFinal.Value);
                this.DataBase.AddInParameter(command, "ValorInferior", DbType.Decimal, request.ValorInferior.Value);
                this.DataBase.AddInParameter(command, "ValorSuperior", DbType.Decimal, request.ValorSuperior.Value);
                this.DataBase.AddInParameter(command, "PercentualAliquota", DbType.Decimal, request.PercentualAliquota.Value);
                this.DataBase.AddInParameter(command, "ValorAcrescimo", DbType.Decimal, request.ValorAcrescimo.Value);
                
                
                #endregion

               command.CommandText = sql.ToString();
               this.DataBase.ExecuteNonQuery(command);
            }
			

		}
        #endregion
        #region ObterFaixaCorretagem
        /// <summary>
		/// Método ObterFaixaCorretagem
		/// </summary>
		public BusinessEntity.FaixaCorretagem ObterFaixaCorretagem(BusinessEntity.Parameter.FiltroFaixaCorretagemChave parameter)
		{
            BusinessEntity.FaixaCorretagem response = null;
            StringBuilder sql = new StringBuilder();

            using (DbCommand command = this.DataBase.GetSqlStringCommand(" "))
            {
                #region SQL
                sql.Append(@"SELECT	A.NR_FAIXA	NumeroFaixa	
                ,	A.DT_PREINI	DataInicial	
                ,	A.DT_PREFIM	DataFinal	
                ,	A.VL_VALINF	ValorInferior
                ,	A.VL_VALSUP	ValorSuperior
                ,	A.PC_ALIQUO	PercentualAliquota
                ,	A.VL_ACRESC	ValorAcrescimo
                FROM	TBOFAIXA A
                WHERE  A.NR_FAIXA = :NumeroFaixa	
                AND	A.DT_PREINI = :DataInicial");
                #endregion

                #region Filtro
                this.DataBase.AddInParameter(command, "NumeroFaixa", DbType.Int32, parameter.NumeroFaixa.Value);
                this.DataBase.AddInParameter(command, "DataInicial", DbType.DateTime, parameter.DataInicial.Value);

                #endregion

                command.CommandText = sql.ToString();

                response = this.FindOne<BusinessEntity.FaixaCorretagem>(command, new ConstructEntity<BusinessEntity.FaixaCorretagem>(ConstrutorConsultarFaixasCorretagens));

                return response;

            }




        }
        #endregion
        #region ObterNumeroUltimaFaixa
        /// <summary>
		/// Método ObterNumeroUltimaFaixa
		/// </summary>
		public int? ObterNumeroUltimaFaixa(DateTime dataInicial)
		{

            int? response = null;
            StringBuilder sql = new StringBuilder();

            sql.Append(@"SELECT  MAX(A.NR_FAIXA)  NumeroFaixa  
            FROM  TBOFAIXA A
            WHERE    A.DT_PREINI = :DataInicial");


            

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "DataInicial", DbType.DateTime, dataInicial);
                response = this.FindOne<int?>(command, new ConstructEntity<int?>(ConstrutorObterNumeroUltimaFaixa));
            }

            return response;
			
        }
        #endregion
        #region ConstrutorObterNumeroUltimaFaixa
        /// <summary>
        /// Obter Numero Ultima Faixa
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        protected int? ConstrutorObterNumeroUltimaFaixa(IDataReader reader)
        {
            int? response = null;
            response = reader.GetValue<int?>("NumeroFaixa");
            return response;
        }
        #endregion
        #region ObterQtdeFaixasConflitoVigencia
        /// <summary>
		/// Método ObterQtdeFaixasConflitoVigencia
		/// </summary>
		public int ObterQtdeFaixasConflitoVigencia(BusinessEntity.Periodo request)
		{
			int response = 0;
            StringBuilder sql = new StringBuilder();

            sql.Append("SELECT COUNT(1) QTDE ");
            sql.Append(" FROM TBOFAIXA ");
            sql.Append(" WHERE ");
            sql.Append(" (:DataInicial BETWEEN DT_PREINI AND DT_PREFIM) ");
            sql.Append(" OR ");
            sql.Append(" (:DataFinal BETWEEN DT_PREINI AND DT_PREFIM) ");
            sql.Append(" OR ");
            sql.Append(" (DT_PREINI BETWEEN :DataInicial AND :DataFinal) ");
            sql.Append(" OR ");
            sql.Append(" (DT_PREFIM BETWEEN :DataInicial AND :DataFinal)"); 


            

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "DataInicial", DbType.DateTime, request.DataInicial.Value);
                this.DataBase.AddInParameter(command, "DataFinal", DbType.DateTime, request.DataFinal.Value);

                response = this.FindOne<int>(command, new ConstructEntity<int>(ConstrutorObterQtdeFaixasConflitoVigencia));
            }

            return response;

            

		}

        #endregion
        #region ConstrutorObterQtdeFaixasConflitoVigencia
        protected int ConstrutorObterQtdeFaixasConflitoVigencia(IDataReader reader)
        {
            int response = 0;
            response = reader.GetValue<int>("QTDE");
            return response;
        }
        #endregion
        #region ObterFaixaCorretagemAnterior
        /// <summary>
        /// Obtém a faixa corretagem anterior
        /// </summary>
        public BusinessEntity.FaixaCorretagem ObterFaixaCorretagemAnterior(BusinessEntity.Parameter.FiltroFaixaCorretagemChave parameter) 
        {
            BusinessEntity.FaixaCorretagem response = null;

            StringBuilder sql = new StringBuilder();
            sql.Append(" SELECT ");
            sql.Append(" A.NR_FAIXA	NumeroFaixa,	");
            sql.Append(" A.DT_PREINI	DataInicial,	");
            sql.Append(" A.DT_PREFIM	DataFinal,	");
            sql.Append(" A.VL_VALINF	ValorInferior,");
            sql.Append(" A.VL_VALSUP	ValorSuperior,");
            sql.Append(" A.PC_ALIQUO	PercentualAliquota,");
            sql.Append(" A.VL_ACRESC	ValorAcrescimo");
            sql.Append(" FROM TBOFAIXA A ");
            sql.Append(" WHERE NR_FAIXA IN( ");
            sql.Append(" SELECT MAX(NR_FAIXA) FROM TBOFAIXA ");
            sql.Append(" WHERE ");
            sql.Append(" DT_PREINI = :DataInicial AND ");
            sql.Append(" NR_FAIXA < :NumeroFaixa) ");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "DataInicial", DbType.DateTime, parameter.DataInicial.Value);
                this.DataBase.AddInParameter(command, "NumeroFaixa", DbType.Int32, parameter.NumeroFaixa.Value);

                response = this.FindOne<BusinessEntity.FaixaCorretagem>(command, new ConstructEntity<BusinessEntity.FaixaCorretagem>(ConstrutorConsultarFaixasCorretagens));
            }

            return response;
        }
        #endregion
        #endregion
    }
}

